﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using public_dbOpt;

namespace prjEMR22_154
{
    public partial class MR_contrl_exdit : Form
    {
        dbOPT dataOpt = new dbOPT();
        public static string strHspID;
        public static string search_child;
        public static int strxuhao;

        // 递归删除子菜单项的辅助方法  
        private void RemoveMenuItemsRecursively(ToolStripMenuItem parentItem, List<string> menuItemsToRemove)  
        {  
            foreach (ToolStripMenuItem childItem in parentItem.DropDownItems)  
            {  
                // 检查当前子菜单项的Text是否在要删除的列表中  
                if (menuItemsToRemove.Contains(childItem.Text))  
                {  
                    // 删除子菜单项  
                    parentItem.DropDownItems.Remove(childItem);  
                }  
                else  
                {  
                    // 如果当前子菜单项还有子菜单项，则继续递归检查  
                    RemoveMenuItemsRecursively(childItem, menuItemsToRemove);  
                }  
            }  
        }
       
        public Dictionary<string, string> GetControlTexts()  //字典函数，用于导出模板时使用
        {  
            var controlTexts = new Dictionary<string, string>();  
            foreach (Control control in this.Controls)  
            {  
                if (!string.IsNullOrEmpty(control.Name) && control is TextBox )  
                {  
                    controlTexts[control.Name] = control.Text;  
                }  
            }  
            return controlTexts;  
        }

        public MR_contrl_exdit()        //全局事件函数，用于导入模板
        {
            InitializeComponent();
            GlobalEvents.MessageReceivedByGrandparent += HandleMessageFromGrandchild;
        }

        private void MR_contrl_exdit_Load(object sender, EventArgs e)   //初始化
        {
            strHspID = MR_contrl.strHSPID;
            if (MR_contrl.New_check)
            {// 假设你有一个MenuStrip控件名为menuStrip1  
                // 并且你想要删除具有特定Text属性的多个菜单项  
                // 创建一个要删除的菜单项Text的列表  
                List<string> menuItemsToRemove = new List<string> { "编辑", "取消", "删除病历" };

                List<ToolStripMenuItem> itemsToRemove = new List<ToolStripMenuItem>();
                foreach (ToolStripMenuItem item in menuStrip1.Items)
                {
                    if (menuItemsToRemove.Contains(item.Text))
                    {
                        itemsToRemove.Add(item);
                    }
                    // 注意：这里不应该调用递归方法，因为我们还没有处理完所有父项。  
                }

                // 现在删除收集到的项  
                foreach (ToolStripMenuItem item in itemsToRemove)
                {
                    menuStrip1.Items.Remove(item);
                    // 注意：如果item有子项，并且你也想删除它们，  
                    // 你需要在这里添加额外的逻辑来处理子项的删除。  
                }

                OpenBoxes(this);
                label18.Visible = false;
            }

            else
            {
                string sql = String.Format("select * from medrecordinfo where HspID = '{0}' and 病历序号 = '{1}';", strHspID,MR_contrl.MR_ID);
                DataSet ds = new DataSet();//创建数据集
                ds = dataOpt.GetTable(sql);
                if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    // 访问数据集中的数据  
                    DataRow row = ds.Tables[0].Rows[0]; // 获取第一行数据  
                    InitBoxes(this, row);//初始化设置各个控件的初始值
                }
                CloseBoxes(this);
            }
            MR_contrl_exdit_RO PatientInfo = new MR_contrl_exdit_RO(); //实例化一个子窗口
            //设置子窗口不显示为顶级窗口
            PatientInfo.TopLevel = false;
            //设置子窗口的样式，没有上面的标题栏
            PatientInfo.FormBorderStyle = FormBorderStyle.None;
            //填充
            PatientInfo.Dock = DockStyle.Fill;
            //清空Panel里面的控件 
            this.panel1.Controls.Clear();
            //加入控件
            this.panel1.Controls.Add(PatientInfo);
            //让窗体显示
            PatientInfo.Show();

        }
        private void InitBoxes(Control parent, DataRow row)  //初始化设置各个控件的初始值
        {
            foreach (Control ctrl in parent.Controls)
            {
                if (ctrl is TextBox)
                {
                    TextBox textBox = (TextBox)ctrl;
                    string columnName = ctrl.Name == "Pa_Name" ? "Name" : ctrl.Name;

                    // 检查列是否存在并尝试获取值  
                    if (row.Table.Columns.Contains(columnName))
                    {
                        object value = row[columnName];
                        if (value != DBNull.Value) // 检查值是否为 DBNull  
                        {
                            textBox.Text = value.ToString();
                        }
                    }
                    // 如果列不存在，可以选择记录日志、抛出异常或执行其他操作  
                    // else { /* 处理列不存在的情况 */ }  
                }

                if (ctrl is ComboBox)
                {
                    ComboBox textBox = (ComboBox)ctrl;

                    if (row.Table.Columns.Contains(ctrl.Name))
                    {
                        object value = row[ctrl.Name];
                        if (value != DBNull.Value) // 检查值是否为 DBNull  
                        {
                            textBox.Text = value.ToString();
                        }
                    }
                    // 如果列不存在，可以选择记录日志、抛出异常或执行其他操作  
                    // else { /* 处理列不存在的情况 */ } 
                }
                // 递归遍历子控件  
                if (ctrl.Controls.Count > 0)
                {
                    InitBoxes(ctrl, row);
                }
            }

        }

        private void OpenExdit_Click(object sender, EventArgs e)//打开编辑
        {
            OpenBoxes(this);
            label18.Text = "编辑模式";

        }

        private void CencelExdit_Click(object sender, EventArgs e)//取消编辑
        {
            CloseBoxes(this);
            label18.Text = "只读模式";

        }

        private void CloseBoxes(Control parent)  //关闭编辑模式函数
        {
            foreach (Control ctrl in parent.Controls)
            {
                if (ctrl is TextBox)
                {
                    TextBox textBox = (TextBox)ctrl;
                    textBox.ReadOnly = true;
                }

                if (ctrl is ComboBox)
                {
                    ComboBox textBox = (ComboBox)ctrl;
                    textBox.Enabled = false;
                }
                // 递归遍历子控件  
                if (ctrl.Controls.Count > 0)
                {
                    CloseBoxes(ctrl);
                }
            }

        }

        private void OpenBoxes(Control parent)  //打开编辑模式函数
        {
            foreach (Control ctrl in parent.Controls)
            {
                if (ctrl is TextBox)
                {
                    TextBox textBox = (TextBox)ctrl;
                    textBox.ReadOnly = false;
                }

                if (ctrl is ComboBox)
                {
                    ComboBox textBox = (ComboBox)ctrl;
                    textBox.Enabled = true;
                }
                // 递归遍历子控件  
                //if (ctrl.Controls.Count > 0)
                //{
                //    OpenBoxes(ctrl);
                //}
            }

        }
        private void new_check()
        {
            string MR_ID = MR_contrl_exdit_RO.MR_ID;
            string sql = String.Format("select * from medrecordinfo where 病历序号 ='{0}' and HspID = '{1}'", MR_ID, strHspID);
            DataSet ds = new DataSet();//创建数据集
            ds = dataOpt.GetTable(sql);

            if (ds != null && ds.Tables[0].Rows.Count != 0)
            {
                // 处理用户存在的情况  
                MessageBox.Show("病历序号已存在。");
            }
            else
            {
                sql = String.Format("INSERT INTO medrecordinfo (病历序号,HspID) VALUES ('{0}','{1}')", MR_ID, strHspID);
                dataOpt.OperateData(sql);
                foreach (Control ctrl in this.Controls)
                {
                    if (ctrl is TextBox)
                    {
                        TextBox textbox = (TextBox)ctrl;
                        string text_name = textbox.Name;
                        sql = String.Format("UPDATE medrecordinfo SET {0} = '{1}' where 病历序号 = '{2}'", text_name, textbox.Text, MR_ID);   //set后跟的属性不能加''
                        dataOpt.OperateData(sql);
                    }

                    if (ctrl is ComboBox)
                    {
                        ComboBox textbox = (ComboBox)ctrl;
                        sql = String.Format("UPDATE medrecordinfo SET {0} = '{1}' where 病历序号 = '{2}'", textbox.Name, textbox.Text, MR_ID);
                        dataOpt.OperateData(sql);
                    }
                }
                MessageBox.Show("保存成功");
            }
        }

        private void Save_Click(object sender, EventArgs e)    //保存
        {
            if (MR_contrl.New_check)
            {
                new_check();
            }
            else
            {
                foreach (Control ctrl in this.Controls)
                {
                    if (ctrl is TextBox)
                    {
                        TextBox textbox = (TextBox)ctrl;
                        string text_name = textbox.Name == "Pa_Name" ? "Name" : textbox.Name;
                        string sql = String.Format("UPDATE medrecordinfo SET {0} = '{1}' where HspID = '{2}' and 病历序号 = '{3}'", text_name, textbox.Text, strHspID, MR_contrl.MR_ID);   //set后跟的属性不能加''
                        dataOpt.OperateData(sql);
                    }

                    if (ctrl is ComboBox)
                    {
                        ComboBox textbox = (ComboBox)ctrl;
                        string sql = String.Format("UPDATE medrecordinfo SET {0} = '{1}' where HspID = '{2}' and 病历序号 = '{3}'", textbox.Name, textbox.Text, strHspID, MR_contrl.MR_ID);
                        dataOpt.OperateData(sql);
                    }
                }
                MessageBox.Show("保存成功");
            }

        }

        private void Cencel_Click(object sender, EventArgs e)  //取消,取消此前的操作
        {
            string sql = String.Format("select * from medrecordinfo where HspID = '{0}' and 病历序号 = '{1}';", strHspID, MR_contrl.MR_ID);;
            DataSet ds = new DataSet();//创建数据集
            ds = dataOpt.GetTable(sql);

            if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
            {
                // 访问数据集中的数据  
                DataRow row = ds.Tables[0].Rows[0]; // 获取第一行数据  
                InitBoxes(this, row);//初始化设置各个控件的初始值
            }
        }

        private void Delete_Click(object sender, EventArgs e)  //删除操作
        {
            strxuhao = MR_contrl.MR_ID;
            MR_contrl_exditDE a = new MR_contrl_exditDE();  //展开病人数据
            MR_contrl_exditDE.Word = "MR_contrl_exdit";
            a.ShowDialog(this);

            if (MR_contrl_exditDE.Medrecrd_check) //已删除，清除文本
            {
                foreach (Control control in this.Controls)
                {
                    if (control is TextBox)
                    {
                        ((TextBox)control).Text = "";
                    }
                    if (control is ComboBox)
                    {
                        ((ComboBox)control).Text = "";
                    }

                }
            }

        }

        private void toolStripMenuItem1_Click(object sender, EventArgs e)
        {

        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {

        }

        private void template_out_Click(object sender, EventArgs e)
        {
            MR_contrl_exdit_out form2 = new MR_contrl_exdit_out(this);
            form2.Show(); 
        }

        //执行导入功能
        private void template_in_Click(object sender, EventArgs e)
        {
            MR_contrl_exdit_search a = new MR_contrl_exdit_search();
            a.Show();
        }
        private void HandleMessageFromGrandchild(string message)  
        {  
            // 处理从孙子窗体传递过来的消息  
            string sql = String.Format("select * from templateinfo where TemplateID = '{0}';", message);
            DataSet ds = new DataSet();//创建数据集
            ds = dataOpt.GetTable(sql);

            if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
            {
                // 访问数据集中的数据  
                DataRow row = ds.Tables[0].Rows[0]; // 获取第一行数据  
                foreach (Control ctrl in this.Controls)
                {
                    if (ctrl is TextBox)
                    {
                        TextBox textBox = (TextBox)ctrl;
                        string columnName = ctrl.Name;

                        // 检查列是否存在并尝试获取值  
                        if (row.Table.Columns.Contains(columnName))
                        {
                            object value = row[columnName];
                            if (value != DBNull.Value) // 检查值是否为 DBNull  
                            {
                                textBox.Text = value.ToString();
                            }
                        }
                        // 如果列不存在，可以选择记录日志、抛出异常或执行其他操作  
                        // else { /* 处理列不存在的情况 */ }  
                    }

                }
            }
        }  
  
        // 确保在窗体关闭时取消订阅事件，以避免内存泄漏  
        protected override void OnFormClosed(FormClosedEventArgs e)  
        {  
            base.OnFormClosed(e);  
            GlobalEvents.MessageReceivedByGrandparent -= HandleMessageFromGrandchild;  
        }

    }
}
